package co.edu.uniandes.ecos.itera.tsp.interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import co.edu.uniandes.ecos.itera.tsp.anotaciones.Loc;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.LogT;
import co.edu.uniandes.ecos.itera.tsp.anotaciones.Tiempos;
import co.edu.uniandes.ecos.itera.tsp.mundo.Ciclo;
import co.edu.uniandes.ecos.itera.tsp.mundo.DelegadoNegocio;
import co.edu.uniandes.ecos.itera.tsp.mundo.Desarrollador;
import co.edu.uniandes.ecos.itera.tsp.mundo.Etapa;
import co.edu.uniandes.ecos.itera.tsp.mundo.Proyecto;
import co.edu.uniandes.ecos.itera.tsp.mundo.Rol;
import co.edu.uniandes.ecos.itera.tsp.mundo.Tarea;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

/**
 * Panel para ofrecer funcionalidad del manejo de Interrupciones
 */
public class ManejarTareas extends JPanel implements ActionListener
{

	/**
	 * Titulo que indica el codigo de la Tarea deseada
	 */
	private JLabel labCodTask;
	/**
	 * Se optiene elcodigo de la Tarea deseada
	 */
	private JTextField txtCodTask;
	/**
	 * Titulo que indica la descripcion de la tarea
	 */
	private JLabel labDescipTask;
	/**
	 * se optiene la descripcion de la Tarea
	 */
	private JTextField txtDescrpTask;
	/**
	 * Titulo de Tiempo estimado
	 */
	private JLabel labTimeEstimado;
	/**
	 * se optiene el tiempo estimado
	 */
	private JTextField txtTimeEstimado;
	/**
	 * Titulo para tiempo real
	 */
	private JLabel labTimeReal;
	/**
	 * Informar tiempo real
	 */
	private JTextField txtTimeReal;
	/**
	 * Titulo LOC estimado
	 */
	private JLabel labLocEstimados;
	/**
	 * Optiene los Loc Estimador
	 */
	private JTextField txtLocEstimados;
	/**
	 * Titulo LOC Reales
	 */
	private JLabel labLocReales;
	/**
	 * Informa los LOC Reales
	 */
	private JTextField txtLocReales;
	/**
	 * Titulo de Desarrollador
	 */
	private JLabel labDesarrollador;
	/**
	 * Se selecciona el desarrollador
	 */
	private JComboBox txtDesarrollador; 
	/**
	 * Tirulo Etapa
	 */
	private JLabel labEtapa;
	/**
	 * Selecciona Etapa
	 */
	private JComboBox cmbEtapa;
	/**
	 * Titulo Terminada la tarea
	 */
	private JLabel labTerminada;
	/**
	 * Informa si la etapa esta terminada o no
	 */
	private JCheckBox chbTerminada;
	
	
	/**
	 * Boton de Guardar o Almacenar la Informacion de la Interrupcion
	 */
	private JButton butGuardar;
	
	/**
	 * Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	@SuppressWarnings("unused")
	private DelegadoNegocio accesoAMundo;
	
	/**
	 * Tarea que se esta trabajando en estos momentos en esta pantalla
	 */
	private Tarea tareaTrabajandose;
	
	/**
	 * Referencia al objeto contenedor. Este es el objeto
	 * que maneja la pantalla principal, o sea el admon de proyectos
	 */
	private MenuPrincipal referenciaAContenedor;
	/**
	 * Objeto para determinar los ciclos del proyecto
	 */
	private Ciclo cicloTarea;
	/**
	 * Objeto para determinar los desarrolladores que estan participando en el
	 * proyecto.
	 */
	private Proyecto proyectoTarea;
	/**
	 * Determina como unico a este objeto
	 */
	private static final long serialVersionUID = 1L;
	private static final String GUARDAR="guardar";
	
	/**
	 * Consutrctor por defecto
	 * @param mundo Referencia al objeto que permite trabajar las transacciones de negocio
	 */
	@LogT(date = "2011-03-20", min = 7, taskId = 80)
//	@Loc(size = 6, taskId = 80)
	
	public ManejarTareas(DelegadoNegocio mundo, MenuPrincipal contenedor, Ciclo ciclo, Proyecto proyecto)
	{
		this.accesoAMundo = mundo;
		this.referenciaAContenedor = contenedor;
		this.cicloTarea=ciclo;
		this.proyectoTarea=proyecto;
		this.tareaTrabajandose = null;
		this.pintarse();
	}
	
	/**
	 * Se encarga de pintar los elementos de la pantalla 
	 */
	@Tiempos({
		@LogT(date = "2011-03-20", min = 53, taskId = 111),
		@LogT(date = "2011-03-21", min = 21, taskId = 111)
	})
	@Loc(size = 60, taskId = 111)
	private void pintarse()
	{
		// Asociacion de un distribuidor grafico y de las dimensiones
		setLayout(new GridLayout(12, 1));
		setPreferredSize(new Dimension(500, 300));
		
		//Definicion del borde
		TitledBorder border = BorderFactory.createTitledBorder("Manejador de Tareas");
		border.setTitleColor(Color.BLUE);
		setBorder(border);
		
		// Etiqueta y Zona de Texto con la informacion de la interrupcion
		labCodTask = new JLabel("Codigo de la Tarea");
		txtCodTask = new JTextField();
		labDescipTask= new JLabel("Descripcion Tarea");
		txtDescrpTask = new JTextField();
		labTimeEstimado = new JLabel("Tiempo Estimado");
		txtTimeEstimado = new JTextField();
		labTimeReal = new JLabel("Tiempo Real");
		txtTimeReal = new JTextField();
		txtTimeReal.setEnabled(false);
		labLocEstimados = new JLabel("LOC Estimados");
		txtLocEstimados = new JTextField();
		labLocReales = new JLabel("LOC Reales");
		txtLocReales = new JTextField();
		txtLocReales.setEnabled(false);
		labDesarrollador = new JLabel("Desarrollador");
		txtDesarrollador = new JComboBox();
		List<Integer> listaIDsDesarrolladores = new ArrayList<Integer>();
		for(Rol rol: this.proyectoTarea.listarRoles())
		{
			for(Desarrollador desarrollador: rol.listarDesarrolladores())
			{
				if(!listaIDsDesarrolladores.contains(desarrollador.getCodigo()))
				{
					listaIDsDesarrolladores.add(desarrollador.getCodigo());
					txtDesarrollador.addItem(desarrollador);
				}
			}
		}
		labEtapa = new JLabel("Etapa");
		cmbEtapa = new JComboBox(Etapa.values());
		labTerminada = new JLabel("Terminada");
		chbTerminada = new JCheckBox();
		chbTerminada.setEnabled(false);

		
		//Boton "Guardar"
		butGuardar = new JButton("Guardar");
		butGuardar.setActionCommand(GUARDAR);
		butGuardar.addActionListener(this);
		
		//Adicionar todos los componentes graficos al panel
		add(labCodTask);
		add(txtCodTask);
		add(labDescipTask);
		add(txtDescrpTask);
		add(labTimeEstimado);
		add(txtTimeEstimado);
		add(labTimeReal);
		add(txtTimeReal);
		add(labLocEstimados);
		add(txtLocEstimados);
		add(labLocReales);
		add(txtLocReales);
		add(labDesarrollador);
		add(txtDesarrollador);
		add(labEtapa);
		add(cmbEtapa);
		add(labTerminada);
		add(chbTerminada);
		add(butGuardar);	
	}
	
	/**
	 * Se encarga de cargar la Tarea en pantalla para
	 * poderlo manejar por el usuario 17:42
	 * @param defectoACargar Informacion de la tarea que se desea actualizar
	 */
	@LogT(date = "2011-03-20", min = 28, taskId = 111)
	@Loc(size = 10, taskId = 111)
	public void cargarEntidad(Tarea tareaACargar)
	{
		this.tareaTrabajandose = tareaACargar;
		
		this.txtCodTask.setText(""+this.tareaTrabajandose.getCodigo());
		this.txtDescrpTask.setText(this.tareaTrabajandose.getDescripcion());
		this.txtTimeEstimado.setText(""+this.tareaTrabajandose.getMinutosEstimados());
		this.txtTimeReal.setText(""+this.tareaTrabajandose.getMinutosReales());
		this.txtLocEstimados.setText(""+this.tareaTrabajandose.getLineasDeCodigoEstimadas());
		this.txtLocReales.setText(""+this.tareaTrabajandose.getLineasDeCodigoReales());
		this.cmbEtapa.setSelectedItem(this.tareaTrabajandose.getEtapa());
		this.txtDesarrollador.addItem(this.tareaTrabajandose.getDesarrollador());
		this.chbTerminada.setSelected(this.tareaTrabajandose.seHaTerminado());
	}
	
	/**
	 * Almacena el Interrupcion, ya sea creado o modificado 00:00
	 */
	@LogT(date = "2011-03-21", min = 49, taskId = 111)
	@Loc(size = 34, taskId = 111)
	public void almacenar()
	{
		if (txtCodTask.getText().trim().length()==0 || 
			txtDescrpTask.getText().trim().length()==0 ||
			txtTimeEstimado.getText().trim().length()==0||
			txtLocEstimados.getText().trim().length()==0 ||
			txtDesarrollador.getSelectedItem()==null) 
		{
			JOptionPane.showMessageDialog(null, "Debe proveer los datos que se le estan preguntando", "Error", JOptionPane.ERROR_MESSAGE);
		}
		else // si se han llenado todos los datos de la pantalla
		{
			if (this.tareaTrabajandose==null) //se esta creando una tarea
			{
				this.tareaTrabajandose= new Tarea();
				this.tareaTrabajandose.setCodigo(Integer.parseInt(this.txtCodTask.getText().trim()));
				this.tareaTrabajandose.setDescripcion(this.txtDescrpTask.getText().trim().toUpperCase());
				this.tareaTrabajandose.setLineasDeCodigoEstimadas(Integer.parseInt(this.txtLocEstimados.getText().trim()));
				this.tareaTrabajandose.setMinutosEstimados(Integer.parseInt(this.txtTimeEstimado.getText().trim()));
				this.tareaTrabajandose.setDesarrollador((Desarrollador) txtDesarrollador.getSelectedItem());
				this.tareaTrabajandose.setEtapa((Etapa) this.cmbEtapa.getSelectedItem());
				this.cicloTarea.agregarTarea(this.tareaTrabajandose);
			}
			else //si ya existe
			{
				this.tareaTrabajandose= new Tarea();
				this.tareaTrabajandose.setCodigo(Integer.parseInt(this.txtCodTask.getText().trim()));
				this.tareaTrabajandose.setDescripcion(this.txtDescrpTask.getText().trim().toUpperCase());
				this.tareaTrabajandose.setLineasDeCodigoEstimadas(Integer.parseInt(this.txtLocEstimados.getText().trim()));
				this.tareaTrabajandose.setMinutosEstimados(Integer.parseInt(this.txtTimeEstimado.getText().trim()));
				this.tareaTrabajandose.setDesarrollador((Desarrollador) txtDesarrollador.getSelectedItem());
				this.tareaTrabajandose.setEtapa((Etapa) this.cmbEtapa.getSelectedItem());
			}
			
			JOptionPane.showMessageDialog(null, "Tarea almacenada exitosamente", "Exito", JOptionPane.INFORMATION_MESSAGE);
			
			this.referenciaAContenedor.cargarArbol();
		}
		
	}

	@Override
	@LogT(date = "2011-03-20", min = 3, taskId = 111)
	@Loc(size = 5, taskId = 111)
	public void actionPerformed(ActionEvent evento)
	{
		String comando = evento.getActionCommand();
		if (comando.equals(GUARDAR)) 
		{
			this.almacenar();
		}
		
	}
	
}
